//6, object 任意的JS对象

let j: object;
j = {};
j = function () { }


// {}用来指定对象中可以包含哪些属性
//语法: {属性名:属性值,属性名:属性值}

//在属性名后边加上?, 表示属性是可选的
let k: { name: string, age?: number }
k = { name: 'lys', age: 18 }


// [propName:string]：any表示任意类型的属性
let l: { name: string, [propName: string]: unknown }
l = { name: 'lys', age: 18, gender: 'male' }


/**
 * 设置函数结构的类型声明：
 *   语法：(形参:类型，形参:类型。。。。)=>返回值类型
 *  */

let q: (a: number, b: number) => string;

q = function (a, b) {
   return (a + b).toString()
}


/*
*   数组的类型声明：
*       类型[]
*       Array<类型>
* */
//7, array
// string[] 表示字符串数组
let w: string[];
w = ['1', '3', 'e']

//number[] 表示数值的数组
let r: number[];
r = [1, 23]

let t: Array<number>;
t = [3, 4, 5]


/*
* 8,  元组，元组就是固定长度的数组
*       语法：[类型, 类型, 类型]
* */

let u: [string, string, number];
u = ['hello', 'world', 123]


/*
*9, enum 枚举
*
* */

enum Gender {
   Male = 1,
   Female = 2
}
let i: { name: string, gender: Gender }

i = { name: 'lys', gender: Gender.Female }
// console.log(i.gender === Gender.Female);


// &表示同时
let a: { name: string } & { age: number }
a = { name: 'lys', age: 18 }


// 类型的别名
type myType = 1 | 2 | 3 | 4 | 0;
let z: myType
let v: myType

z = 4